#ifndef MAINWIDGET_H
#define MAINWIDGET_H
#pragma once
#include <QWidget>
#include <QPushButton>
#include <QLineEdit>
#include <QHBoxLayout>
#include <QHash>
#include "messageshowarea.h"
#include "messageeditarea.h"
#include "sessionfriendarea.h"

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWidget;
}
QT_END_NAMESPACE

class MainWidget : public QWidget
{
    Q_OBJECT
private:
    //单例
    static MainWidget *instance;

    MainWidget(QWidget *parent = nullptr);


public:
    static MainWidget* getInstance();

    ~MainWidget();

private:
    Ui::MainWidget *ui;

    // 窗口左侧部分
    QWidget* windowLeft;
    // 窗口中间部分
    QWidget* windowMid;
    // 窗口右侧部分
    QWidget* windowRight;

    //------------ windowLeft -------------
    // 好友头像
    QPushButton* userAvatar;
    // 会话标签页按钮
    QPushButton* sessionTabBtn;
    // 好友标签页按钮
    QPushButton* friendTabBtn;
    // 好友申请标签页按钮
    QPushButton* applyTabBtn;

    // 枚举标签页类型
    enum ActiveTab {
        SESSION_TAB,
        FRIEND_TAB,
        APPLY_TAB
    };
    // 当前所处的标签页
    ActiveTab activeTab = SESSION_TAB;

    //------------ windowMid -------------
    // 用户搜索编辑框
    QLineEdit* searchEdit;
    // 添加好友按钮
    QPushButton* addFriendBtn;

    // 好友滚动区域
    SessionFriendArea* sessionFriendArea;


    //------------ windowRight -------------
    // 会话标题
    QLabel* sessionTitleLabel;
    // 消息展示区
    MessageShowArea* messageShowArea;
    // 消息编辑区
    MessageEditArea* messageEditArea;
    // 会话详情按钮 ...
    QPushButton* extraBtn;

public:
    //初始化主窗口、左、中、右窗口样式布局
    void initMainWindow();
    void initLeftWindow();
    void initMidWindow();
    void initRightWindow();

    // 初始化信号槽
    void initSignalSlot();

    // 初始化webSocket
    void initWebSocket();

    // 槽函数--切换标签页到会话列表
    void switchTabToSessionList();
    // 槽函数--切换标签页到好友列表
    void switchTabToFriendList();
    // 槽函数--切换标签页到好友申请列表
    void switchTabToApplyList();

    // 加载会话列表到sessionFriendArea
    void loadSessionList();
    // 加载好友列表到sessionFriendArea
    void loadFriendList();
    // 加载好友申请列表到sessionFriendArea
    void loadApplyList();



    // 从内存的friendList中加载数据
    void updateFriendList();
    // 从内存的chatSessionList中加载数据
    void updateChatSessionList();
    // 从内存的applyList中加载数据
    void updateApplyList();
    // 从内存的recentMessages中加载数据
    void updateRecentMessageList(const QString& chatSessionId);

    // 点击会话加载最接近的消息到messageshowarea
    void loadRecentMessage(const QString& chatSessionId);

    // 点击好友item触发转到对应的会话列表，并加载会话消息
    void switchSession(const QString& userId);

    MessageShowArea* getMessageShowArea();
};
#endif // MAINWIDGET_H
